package game.controler;

import game.controler.ecouteurs.vue.EcouteurFondVue;
import game.controler.gestionnaires.elementjeu.GestionnairePnj;
import game.controler.gestionnaires.elementjeu.GestionnairePlans;
import game.controler.gestionnaires.elementjeu.GestionnaireObjets;
import game.controler.gestionnaires.elementjeu.GestionnaireDecors;
import game.controler.gestionnaires.elementjeu.GestionnaireFous;
import game.controler.ecouteurs.vue.EcouteurVueObjet;
import game.controler.ecouteurs.vue.EcouteurVueElmtDecors;
import game.controler.ecouteurs.vue.EcouteurVueFou;
import game.controler.ecouteurs.vue.EcouteurVuePNJ;
import game.gui.panelvue.PanelPlan;
import game.model.Plan;
import game.model.objets.ElementDecors;
import game.model.objets.Fou;
import game.model.objets.Objet;
import game.model.objets.PNJ;
import javax.swing.JLabel;

/**
 *
 * @author Gab'z
 */
public class ControlerPanelVue {

    private static ControlerPanelVue sVue = null;
    private GestionnairePlans Gplans = GestionnairePlans.getGP();
    private GestionnaireObjets Gobjets = GestionnaireObjets.getGobjets();
    private GestionnairePnj Gpnj = GestionnairePnj.getGpnj();
    private GestionnaireFous Gfous = GestionnaireFous.getGfous();
    private GestionnaireDecors Gdecors = GestionnaireDecors.getGdecors();
    private Inventaire inventaire = Inventaire.getInventaire();

    public ControlerPanelVue() {
        System.out.println("Singleton ControlerPanelVue");
    }

    public static ControlerPanelVue getServeurVue() {
        if (sVue == null) {
            sVue = new ControlerPanelVue();
        }
        return sVue;
    }

    /**
     * Construit le JPanel conenant tous les éléments du plan à afficher
     * 
     * @param IdPlan
     * @return 
     */
    public PanelPlan getVue(String IdPlan) {
        PanelPlan panelVue = new PanelPlan();
        System.out.println("ControlerPanelVue.getVue " + IdPlan);

        Plan plan = Gplans.getPlan(IdPlan);


        // Affichage image de fond
        JLabel fond = new JLabel(plan.getFond());
        fond.setLocation(0, 0);
        fond.setSize(640, 480);
        //fond.setOpaque(false);
        fond.addMouseListener(new EcouteurFondVue());
        panelVue.add(fond, new Integer(0));


        // Affichage de tous les objets du plan
        JLabel img;

        // Affichage éléments du décors
        ElementDecors elmtDecors;
        for (String id : plan.getElementsDecors()) {
            elmtDecors = Gdecors.getElementDecors(id);
            if (elmtDecors.isVisible()) {
                System.out.println("affichage de " + elmtDecors.getId());
                img = new JLabel(elmtDecors.getImgJeu());
                // img.setOpaque(false);
                img.setLocation(elmtDecors.getPosition());
                img.setSize(elmtDecors.getDimension());
                // ajout d'un écouteur
                img.addMouseListener(new EcouteurVueElmtDecors(elmtDecors.getId()));
                panelVue.add(img, new Integer(1));
            }
        }

        // Affichage Objets
        Objet objet;
        for (String id : plan.getObjets()) {
            // on ne procède à l'affichage de l'objet que s'il n'est pas déjà dans l'inventaire
            // et que l'objet est actif
            if (!inventaire.hasObjet(id)) {
                objet = Gobjets.getObjet(id);
                if (objet.isVisible()) {
                    System.out.println("affichage de " + objet.getId());
                    img = new JLabel(objet.getImgJeu());
                    // img.setOpaque(false);
                    img.setLocation(objet.getPosition());
                    img.setSize(objet.getDimension());
                    // ajout d'un écouteur
                    img.addMouseListener(new EcouteurVueObjet(objet.getId()));
                    panelVue.add(img, new Integer(objet.isTop() ? new Integer(4) : new Integer(2)));
                }
            }
        }
        // Affichage Fous
        Fou fou;
        for (String id : plan.getFous()) {
            // on ne procède à l'affichage du fou que s'il n'est pas déjà dans l'inventaire
            // et que le fou est actif
            if (!inventaire.hasFou(id)) {
                fou = Gfous.getFou(id);
                if (fou.isVisible()) {
                    System.out.println("affichage de " + fou.getId());
                    img = new JLabel(fou.getImgJeu());
                    // img.setOpaque(false);
                    img.setLocation(fou.getPosition());
                    img.setSize(fou.getDimension());
                    // ajout d'un écouteur
                    img.addMouseListener(new EcouteurVueFou(fou.getId()));
                    panelVue.add(img, new Integer(fou.isTop() ? new Integer(4) : new Integer(2)));
                }
            }
        }

        // Affichage PNJ
        PNJ pnj;
        for (String id : plan.getPnjs()) {
            pnj = Gpnj.getPNJ(id);
            if (pnj.isVisible()) {
                System.out.println("affichage de " + pnj.getId());
                img = new JLabel(pnj.getImgJeu());
                //img.setOpaque(false);
                img.setLocation(pnj.getPosition());
                img.setSize(pnj.getDimension());
                // ajout d'un écouteur
                img.addMouseListener(new EcouteurVuePNJ(pnj.getId()));
                panelVue.add(img, new Integer(3));
            }
        }

        return panelVue;
    }
}
